一起看 I/O | Flutter 2.2 更新详解
Abhishek01039
https://github.com/Abhishek01039
xu-baolin
https://github.com/xu-baolin
每个新的 Flutter 稳定版都会带来诸如性能提升、新功能、bug 修复等一系列变化,并会提供一些尚未试用于生产环境的试验性功能,希望您能帮助我们验证这些功能能否正常工作并满足您的需求。此外,新版本还会包含一系列相关工具的更新和来自 Flutter 社区的更新。坦白讲,如今 Flutter 每个新版本的内容都非常丰富,不可能在一篇文章中巨细无遗地详述,因此下面我们将着重为您介绍一些主要亮点。
Flutter 2.2 稳定版更新
此版本在 Flutter 2 的基础上做了诸多改进,其中不但有面向 Android、iOS 和 web 平台的更新,还有新的 Material 图标、文本处理方式的改进、滚动条行为的变化、TextSpan widget 的鼠标光标支持,以及用一份代码适配多个平台方面的新指南。这些功能皆已发布稳定版,可供您在正式版应用中使用。同时,所有这些功能都是在新版 Dart 的基础上构建而成。
// Type alias for functions (existing)
typedef ValueChanged<T> = void Function(T value);
// Type alias for classes (new!)
typedef StringList = List<String>;
// Rename classes in a non-breaking way (new!)
@Deprecated("Use NewClassName instead")
typedef OldClassName<T> = NewClassName<T>;
有了类型别名,您可为长而复杂的类型赋予简短易懂的名称,并以不会破坏代码的方式重命名您的类。Dart 2.13 版还包含其他多项更新,您可以在我们之前的推文 Dart 2.13 版本发布中了解详情。
Flutter web 更新
作为 Flutter 稳定版最新支持的平台,web 平台在此版本也有多项改进。
首先,我们借助新的 service worker 加载机制优化了缓存行为,并修复了 main.dart.js 的重复下载问题。在旧版 Flutter web 中,service worker 会在后台下载应用更新,用户在此期间可照常使用应用的旧版本。更新下载完毕后,用户要多次刷新浏览器页面后才会看到相应更新。在 Flutter 2.2 版中,当新的 service worker 检测到更新后,用户需要先等待更新下载完毕才能使用应用,但届时他们无需再次手动刷新页面即可看到更新内容。
要启用此项变更,您需要重新生成您的 Flutter 应用的 index.html。具体来说,请保存您的修改、删除 index.html 文件,然后在项目目录中运行 flutter create . 以重新生成该文件。
我们还对两个 web 渲染器都做了改进。在 HTML 渲染器上,我们添加了对字体特性的支持,以启用 FontFeature 设置并使用 canvas API 渲染文本,从而使鼠标悬停处的文本能够显示在适当的位置。在 HTML 和 CanvasKit 渲染器上,我们新增了对着色器遮罩 (shader masks) 和 computeLineMetrics 的支持,以解决 Flutter web 应用和移动应用两者不一致的问题。例如,开发者现在可以通过不透明度遮罩使用着色器遮罩实现淡出转场,并像在移动应用中一样使用 computeLineMetrics。
字体特性 https://developer.mozilla.org/en-US/docs/Web/CSS/font-feature-settings FontFeature https://api.flutter-io.cn/flutter/dart-ui/FontFeature-class.html computeLineMetrics https://api.flutter-io.cn/flutter/painting/TextPainter/computeLineMetrics.html 不透明度遮罩 https://api.flutter-io.cn/flutter/widgets/Opacity-class.html
无障碍功能不但是 Flutter web 的一大重点,也是整个 Flutter 的一个重心所在。按照设计,是通过构建 SemanticsNode 树来实现无障碍功能。Flutter web 应用的用户启用无障碍功能后,我们会生成一个与 RenderObject DOM 树并行的 DOM 树,并将语义属性转换为 Aira。在此版本中,我们改进了语义节点位置,消除了移动应用和 web 应用在使用转换 (transform) 时的不一致,这意味着在使用转换对 widget 进行样式设置时,焦点框会正确地显示在元素上方。如需直观了解其实际效果,您可以观看 Material Design 无障碍项目负责人 Victor Tsaran 的视频,了解他如何对 Flutter Gallery App 使用 VoiceOver:
如何对 Gallery App 使用 VoiceOver
我们现在还提供一个适用于性能分析 (profile) 和发布 (release) 模式的命令行 flag,以供开发者访问语义节点调试树,并直观查看系统为其 web 应用创建的语义节点,从而对应用的无障碍功能进行调试。
$ flutter run -d chrome --profile \
--dart-define=FLUTTER_WEB_DEBUG_SHOW_SEMANTICS=true
激活该 flag 后,您将能够在各个 widget 上方看到您的语义节点,从而进行调试并检查语义元素的位置是否符合预期。如果您发现这类问题,欢迎向我们提交 bug 报告:
虽然在核心无障碍功能的支持方面已经取得了长足进步,但我们仍在这个领域不断改进。在 2.2 稳定版之后的 master 和 dev 渠道 build 中,我们新增了一个 API,供开发者以编程方式为其应用自动启用无障碍功能,同时我们正在着手解决在屏幕阅读器中使用 Tab 键的问题。
自动启用无障碍功能 https://github.com/flutter/engine/pull/25830 在屏幕阅读器中使用 Tab 键 https://github.com/flutter/engine/pull/25797
最后但也同样重要的是,最新版的 Flutter DevTools 现在还支持为您的 Flutter web 应用使用布局浏览器。
您现在可以在 web 应用中使用您所熟悉的布局调试工具,这与移动应用和桌面应用别无二致。
对于 iOS 平台,此版本将动画帧的渲染时间缩减了 75%,使 Cupertino 主题中页面转场更流畅。在低端手机上的缩减比例甚至可能更高。我们不仅改善了最终用户可感知到的性能,还一直在想方设法提升开发性能。
使 Cupertino 主题中页面转场更流畅 https://github.com/flutter/flutter/pull/75670
在此版本中,我们实现了开发过程中的增量式 iOS 安装。基准测试结果显示,iOS 应用的更新版本安装时间缩短了 40%,这也就缩短了您的应用变更测试周期。
增量式 iOS 安装 https://github.com/flutter/flutter/pull/77756
随着 Flutter 稳定版逐步支持更多平台,您在设计应用时不仅需要考虑兼容不同的设备类型 (如手机、平板电脑和桌面电脑),还需要考虑支持不同的输入方式 (触摸与键鼠),以及适配各个平台上的不同使用习惯 (例如在导航时是使用抽屉式导航栏还是系统菜单)。如果应用能够根据不同目标平台的细节差异做出相应调整,我们就称之为平台自适应应用。
如果您想初步了解在构建平台自适应应用时要考虑哪些因素,请观看 Kevin Moore 关于 "构建平台自适应应用" 的视频。如需详细了解,您可以阅读 Flutter 文档中关于平台自适应应用的指南:
构建平台自适应应用 https://events.google.com/io/session/868dfd56-7f8c-49ee-84ad-ac69a23ba19d?lng=en
最后,如需参考遵循这些指南编写出的多平台应用示例。我们建议您看看 gSkinner 打造的 Flokk 和 Flutter Folio 应用。您既可以下载 Flokk 和 Folio 的源代码,也可以从各个应用商店下载 Flokk 和 Folio 应用,还可以直接在浏览器中运行它们。另一个优秀示例是用于创建指南本身的应用:
Flokk https://flutter.gskinner.com/flokk Flutter Folio https://flutter.gskinner.com/folio Flokk 的源代码 https://github.com/gskinnerTeam/flokk Folio 的源代码 https://github.com/gskinnerTeam/flutter-folio 下载 Flokk https://flutter.gskinner.com/flokk/#g-download 下载 Folio https://flutter.gskinner.com/folio/#g-download
Flutter 平台自适应应用指南的 UX 部分以新的 Material 大屏幕指南为基础。Material 团队在新发布的这一指南中,根据大屏幕的特性,修订了多篇主要的布局文章,调整了多个组件,并更新了 Design Kit。
Material 大屏幕指南 https://material.io/blog/material-design-for-large-screens
Flutter 的目标始终是让应用可以走得更高更远,而不仅是能够在多个平台上正常运行。不做到让您的应用能够良好适配所有目标平台,我们不会停下脚步。Flutter 能够为您提供所需支持,让您的应用不但能够覆盖多个目标平台,而且能够针对不同的屏幕尺寸、输入方式以及各平台的不同使用习惯而做出适当的调整。
说起 Material 指南,此版本还纳入了两个独立的 PR,向 Flutter 中添加了更多 Material 图标。我们可爱的吉祥物 Dash 现在也有专属的图标了!
Material 图标 https://github.com/flutter/flutter/pull/76607 https://github.com/flutter/flutter/pull/78311
加上这些新图标,可供您的应用使用的 Material 图标总数现已突破 7,000 大关。如果您在这海量图标中寻找所需图标时遇到了困难,可以访问 fonts.google.com/icons,按类别和名称来搜索图标。
找到理想的图标后,您可以在新的 "Flutter" 标签页中查看有关如何使用该图标的说明。您也可以单独下载这个图标,将其用作应用中的独立资源。在您的 Flutter 应用中加入 Dash 的可爱形象从未如此简单。
随着我们持续改进 Flutter 以使其能够更好地适配各个平台的具体特性,我们正逐步涉足一些在移动设备上不突出但在桌面设备上很重要的新领域,其中之一就是文本处理。在此版本中,我们着手对文本输入的处理方式进行重构,以实现下述功能: 在按键事件于 widget 层次结构内传播的过程中将其取消,以及能够完全自定义与文本操作相关联的按键。
import 'package:flutter/material.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Flutter Text Editing Fun',
home: HomePage(),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
body: Column(
children: [
TextField(),
OutlinedButton(onPressed: () {}, child: const Text('Press Me')),
],
),
);
}
自定义文本操作让您可以实现对 TextField 中的 Enter 按键事件进行特殊处理,例如,使 Enter 键在聊天客户端中触发消息发送操作,同时让用户可以按 Ctrl+Enter 键来换行。此类文本操作让 Flutter 本身也能够提供不同的按键设置,从而使文本编辑行为与主机操作系统相一致,例如在 Windows 和 Linux 上使用 Ctrl+C 复制文本,而在 macOS 上使用 Cmd+C。
让 Flutter 本身也能够提供不同的按键设置 https://github.com/flutter/flutter/pull/75032
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Flutter TextField Key Binding Demo',
home: Scaffold(body: UnforgivingTextField()),
);
}
/// A text field that clears itself if the user tries to back up or correct
/// something.
class UnforgivingTextField extends StatefulWidget {
@override
State<UnforgivingTextField> createState() => _UnforgivingTextFieldState();
}
class _UnforgivingTextFieldState extends State<UnforgivingTextField> {
// The text editing controller used to clear the text field.
late TextEditingController controller;
@override
void initState() {
super.initState();
controller = TextEditingController();
}
@override
Widget build(BuildContext context) => Shortcuts(
shortcuts: <LogicalKeySet, Intent>{
// This overrides the left arrow key binding that the text field normally
// has in order to move the cursor back by a character. The default is
// created by the MaterialApp, which has a DefaultTextEditingShortcuts
// widget in it.
LogicalKeySet(LogicalKeyboardKey.arrowLeft): const ClearIntent(),
// This binds the delete and backspace keys to also clear the text field.
// You can bind any key, not just those already bound in
// DefaultTextEditingShortcuts.
LogicalKeySet(LogicalKeyboardKey.delete): const ClearIntent(),
LogicalKeySet(LogicalKeyboardKey.backspace): const ClearIntent(),
},
child: Actions(
actions: <Type, Action<Intent>>{
// This binds the intent that indicates clearing a text field to the
// action that does the clearing.
ClearIntent: ClearAction(controller: controller),
},
child: Center(child: TextField(controller: controller)),
),
);
}
/// An intent that is bound to ClearAction.
class ClearIntent extends Intent {
const ClearIntent();
}
/// An action that is bound to ClearIntent that clears the TextEditingController
/// passed to it.
class ClearAction extends Action<ClearIntent> {
ClearAction({required this.controller});
final TextEditingController controller;
@override
Object? invoke(covariant ClearIntent intent) {
controller.clear();
}
}
一个糟糕的 TextField 示例,按下左箭头键或 ESC 键会清除文本
在这方面,我们的确还有很多工作要做,但我们将不遗余力赋予开发者对文本编辑操作的完全控制权。目标是在 Flutter 桌面版达到稳定时,最终用户将无法区分 Flutter 应用中的文本编辑功能与主机操作系统中的其他应用有什么差别。
自动滚动行为
import 'package:flutter/material.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Automatic Scrollbars',
home: HomePage(),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
body: ListView.builder(
itemCount: 100,
itemBuilder: (context, index) => Text('Item $index'),
),
);
}
ScrollBarTheme https://api.flutter-io.cn/flutter/material/ThemeData/scrollbarTheme.html ScrollBehavior https://api.flutter-io.cn/flutter/widgets/ScrollBehavior-class.html Flutter 官方文档 https://flutter.cn/docs/release/breaking-changes/default-desktop-scrollbars
TextSpan 上的鼠标指针
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart' as urlLauncher;
void main() => runApp(App());
class App extends StatelessWidget {
static const title = 'Flutter App';
@override
Widget build(BuildContext context) => MaterialApp(
title: title,
home: HomePage(),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text(App.title)),
body: Center(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 48),
children: [
TextSpan(
text: 'This is not a link, ',
style: TextStyle(color: Colors.black),
),
TextSpan(
text: 'but this is',
style: TextStyle(color: Colors.blue),
recognizer: TapGestureRecognizer()
..onTap = () {
urlLauncher.launch('https://flutter.dev');
},
),
],
),
),
),
);
}
Flutter 2.2 中新的预览版功能
http://github.com/flutter/flutter/issues
iOS 着色器编译改进
Skia 针对 Metal 新增对着色器预热的支持
https://github.com/flutter/flutter/issues/79298
应用启动期间的预编译操作的跟踪记录
不过,此解决方案存在一些不足之处:
相比 OpenGL 后端,Skia 仍会为 Metal 后端生成更多的着色器。
最终将着色器编译为机器码的操作仍然与帧工作负载同步发生,但这好过在帧渲染时段内执行所有着色器生成和编译操作。
最终生成的机器码会在应用首次运行后得到缓存,直到设备被重新启动。
https://flutter.cn/docs/perf/rendering/shader#how-to-use-sksl-warmup
由于捆绑了着色器,应用的部署体积更大。 由于需要预编译捆绑的着色器,应用启动延时更长。 对开发者体验可能存在负面影响。
其中,我们最为重视最后一点。我们认为开发者不应该需要执行训练运行,也不应该在应用体积和启动延时方面承担代价。因此,我们还在继续探索是否有不依赖此实现方案的其他方法来消除着色器编译卡顿以及其他类型的卡顿。我们正在与 Skia 团队携手合作,降低 Flutter 请求产生的着色器数量,并探讨在 Flutter 引擎中捆绑少量静态定义的着色器的可行性。
您可以关注 Flutter 代码库中的相关项目了解相关进展:
Android 延迟加载组件: 可下载的 AOT 代码和资源
让 Flutter 应用能够在运行时下载内含预先编译的代码和资源的模块 https://github.com/flutter/flutter/pull/76192
在 Flutter Gallery 应用中下载 Crane 案例
如果在构建应用时启用延迟加载组件,Dart 会将那些单独用 `deferred` 关键字导入的代码编译到独立的共享库中,并将这些库与相关资源一起打包为延迟加载组件。
该功能还处于早期预览阶段,目前只支持 Android。您可以在 Flutter 官方文档上新的延迟加载组件页面中了解如何实现此类组件。此页面还链接到了 Flutter wiki 上的一个页面,后者详细介绍了此功能的工作原理。如果发现问题,请通过 Flutter 问题跟踪器告知我们。
延迟加载组件 https://flutter.cn/docs/perf/deferred-components Flutter 问题跟踪器 http://github.com/flutter/flutter/issues
Flutter Windows UWP alpha 版
满足 UWP 前置条件 https://flutter.cn/desktop#windows-uwp
$ flutter channel dev
$ flutter upgrade
$ flutter config — enable-windows-uwp-desktop
$ flutter create uwp_fun
$ cd uwp_fun
$ flutter pub get
$ flutter run -d winuwp
由于构建的是在 Windows 沙盒环境中运行的 Windows UWP 应用,您需要在开发期间对应用的防火墙进行 localhost 穿透设置,以实现热重载和调试器断点等功能。为此,您可以按照 Flutter 桌面文档页面上的说明使用 checknetisolation 进行操作。完成相关操作后,您就可以在 Windows 上以 UWP 应用的形式运行您喜爱的 Flutter 应用了。
Flutter 桌面文档页面 http://flutter.cn/desktop/#windows-uwp
在 Windows UWP 容器中运行您喜爱的 Flutter 应用
在 Xbox 上运行的 Flutter 应用
clarkezone https://github.com/clarkezone 官方文档 http://flutter.cn/desktop/#windows-uwp
这项杰出贡献来自于 Flutter 社区的 Sony 软件工程师 HidenoriMatsubayashi。他提交的 ARM64 Linux 目标支持这条 PR 让您可以在 ARM64 Linux 机器上构建和运行 Flutter 应用。
HidenoriMatsubayashi https://github.com/HidenoriMatsubayashi ARM64 Linux 目标支持 https://github.com/flutter/flutter/pull/61221
我们很高兴看到 Flutter 社区将 Flutter 移植到超乎 Google 团队想象的平台。HidenoriMatsubayashi,感激不尽!
Flutter 生态系统和工具更新
FlutterFire package (正式版): cloud_firestore、cloud_functions、firebase_auth、firebase_core、firebase_crashlytics、firebase_messaging 和 firebase_storage
http://firebase.flutter.dev
Flutter Community "plus" package: android_alarm_manager_plus、android_intent_plus、battery_plus、connectivity_plus、device_info_plus、network_info_plus、package_info_plus、sensors_plus 和 share_plus
http://plus.fluttercommunity.dev
googleapis package
https://pub.flutter-io.cn/packages/googleapis
win32 package
https://pub.flutter-io.cn/packages/win32
Intl 和 characters package
https://pub.flutter-io.cn/packages/intl https://pub.flutter-io.cn/packages/characters
Sentry package: sentry 和 sentry_flutter
https://pub.flutter-io.cn/packages/sentry_flutter
infinite_scroll_pagination 和 flutter_native_splash package
https://pub.flutter-io.cn/packages/infinite_scroll_pagination
https://pub.flutter-io.cn/packages/flutter_native_splash
Flutter Community "plus" package 在 Flutter 团队官方 package 的基础上提供了更多特性。例如,Google 的 Flutter 团队提供的 battery package 可以追溯到初版 Flutter 发布之前,它现在具备空安全特性,但只支持 Android 和 iOS 平台。与此相对,Flutter Community battery_plus package 则支持全部 6 个 Flutter 平台,包括 web、Windows、macOS 和 Linux。该套件内置的全部 9 个 "plus" package 都获得了 Flutter Favorite 认可,这是标志着整个 Flutter 社区迈向成熟的重大一步。Flutter 项目已经远远不止是 Google 工程团队独力奋战。您应尽快将您的代码迁移至 "plus" package。在未来几周中,Google 的相关 package 将会更新,建议您进行迁移。
battery package
https://pub.flutter-io.cn/packages/battery
Flutter Community battery_plus package
https://pub.flutter-io.cn/packages/battery_plus
googleapis 插件为 185 个 Google API 提供了自动生成的 Dart 封装,供您在客户端或服务器端的 Dart 应用 (包括您的 Flutter 应用) 中使用。如需进一步了解此 package,您可以观看其作者关于使用 Google API 为您的 Flutter 应用赋能的 I/O 大会演讲。
Google API https://developers.google.cn/api-client-library I/O 大会演讲 https://events.google.com/io/session/7f706716-0de0-4a9e-bad3-581afe8ef360
win32 package 堪称一件工程杰作,它使用 Dart FFI 封装了大部分常用 Win32 API 接口,让 Dart 代码无需依赖 C 编译器或 Windows SDK 即可使用这些 API。随着 Flutter 在 Windows 平台上越来越受关注,win32 package 成为了许多热门插件的关键依赖项,其中包括最热门 Flutter package 之一的 path_provider。为了挑战极限,其作者 timsneath 创下了一些惊人壮举,例如使用纯 Win32 和纯 Dart 来实现 notepad (记事本)、snake (贪吃蛇) 和 tetris (俄罗斯方块)。
Dart FFI https://dart.cn/guides/libraries/c-interop path_provider https://pub.flutter-io.cn/packages/path_provider timsneath https://github.com/timsneath notepad https://github.com/timsneath/win32/tree/main/example/notepad snake https://github.com/timsneath/win32/blob/main/example/snake.dart tetris https://github.com/timsneath/win32/tree/main/example/tetris
FlutterFire 更新和 Firebase App Check
Invertase 还在继续为 FlutterFire 插件增添更多功能,包括在新版 Flutter 中对 Cloud Firebase 集成做的多项更新:
用于读写数据的 Typesafe API https://firebase.flutter.dev/docs/firestore/usage/#typing-collectionreference-and-documentreference
支持 Firebase Local Emulator Suite https://firebase.flutter.dev/docs/storage/usage/#emulator-usage
利用 data bundles 优化您的数据查询 https://firebase.flutter.dev/docs/firestore/usage#data-bundles
https://firebase.flutter.dev/docs/app-check/overview
Firebase App Check
https://firebase.google.com/docs/app-check
Flutter DevTools 更新
Flutter DevTools 时间轴标签页自定义内存事件
provider package http://pub.flutter-io.cn/packages/provider Remi Roussel https://github.com/rrousselGit
实战演示: Flutter DevTools Provider 标签页
Remi 是如何构建出 Provider 标签页的 https://invertase.io/blog/how-to-flutter-devtool-plugin Flutter DevTools https://docs.google.com/document/d/1BWX8YQ962Vsx-EUDuDHRG7RX94fJlZSDRu299YRwasE/
上述改进只是此版本 Flutter DevTools 众多改进中的几项。如需完整列表,请查看下列公告:
Flutter DevTools 2.1 版本说明 https://groups.google.com/g/flutter-announce/c/tCreMfJaJFU/m/38p1BBeiCAAJ
Flutter DevTools 2.2.1 版本说明 https://groups.google.com/g/flutter-announce/c/t8opLnUyiFQ/m/dJth-jKxAAAJ
Flutter DevTools 2.2.3 版本说明 https://groups.google.com/g/flutter-announce/c/t8opLnUyiFQ/m/YX5Ds_q0AgAJ
IDE 插件更新
如需此版本中 IDE 扩展的完整变更列表,请查看下列公告:
VS Code 扩展 v3.21
https://groups.google.com/g/flutter-announce/c/gNtKp9c1glU/m/SZYTuwcQBwAJ VS Code 扩展 v3.22
https://groups.google.com/g/flutter-announce/c/1XR7baYZOVI/m/y6MGYrGhAAAJ Flutter IntelliJ 插件 M55 版本
https://groups.google.com/g/flutter-announce/c/tYwFDPAtLu0/m/FrsntcNNBwAJ Flutter IntelliJ 插件 M56 版本
https://groups.google.com/g/flutter-announce/c/EkgiAO4p3UM/m/P32ZXXKfAAAJ
DartPad 随堂实践
引导式讲座体验 https://events.google.com/io/program/content?4=topic_flutter&5=type_workshop DartPad 培训内容创作指南 https://github.com/dart-lang/dart-pad/wiki/Workshop-Authoring-Guide
在 Gist 中通过 DartPad 分享代码 https://github.com/dart-lang/dart-pad/wiki/Sharing-Guide 在您的网站上嵌入 DartPad https://github.com/dart-lang/dart-pad/wiki/Embedding-Guide
https://github.com/dart-lang/dart-pad/issues
社区聚焦: FlutterFlow
Flutter Adaptive Demo App
对兼容性有影响的重大变更
73750 移除已废弃的 BinaryMessages https://github.com/flutter/flutter/pull/73750 73751 移除已废弃的 TypeMatcher 类 https://github.com/flutter/flutter/pull/73751
https://flutter.cn/docs/release/breaking-changes/1-22-deprecations
结语
Google Flutter 团队全体同仁谨此向大家致以诚挚谢意!我们要感谢 Flutter 社区的每一个人,Flutter 取得的成绩离不开大家的每一份贡献。如今,Play 商店中有超过八分之一的新应用是采用 Flutter 构建而成,仅在 Play 商店就收录了多达 20 万款 Flutter 应用。Flutter 的迅猛发展势头出人意表。世界各地大大小小的应用团队都使用 Flutter 进行开发,为诸多平台上的用户打造优质体验。谢谢大家选择 Flutter!
最后,以免您错过,不要忘了体验下在本次 I/O 大会推出的 I/O Photo Booth web 应用,它是由 Flutter 和 Firebase 构建而成的 web 应用,让您可以和 Dash 合拍萌萌的大头照。我们还开放了其源代码,方便您进一步了解 Flutter web 最佳实践、相机插件 web 支持以及如何使用 Cloud Functions 函数来生成自定义社交内容。机不可失,赶紧一睹为快吧!
I/O Photo Booth web 应用
https://photobooth.flutter.cn/#/
I/O Photo Booth web 应用源代码 https://github.com/flutter/photobooth
推荐阅读